package chapter02.part05;

import java.nio.ByteBuffer;

/**
 * 缓冲区数据结构的学习
 * 
 * 上节的内存映射 通过 channel.map() 可以获取一个缓冲区
 * 这节学习其他缓冲区
 * 
 * 缓冲区本质上是一个数组 基类是 Buffer
 * 有 ByteBuffer CharBuffer DoubleBuffer LongBuffer 等等
 * 
 * @author insight
 * @since 2021/8/25
 */
public class BufferTest {
    public static void main(String[] args) {
        int readSize = 10;
        ByteBuffer buffer = ByteBuffer.allocate(readSize);
        
        // 每个缓冲区都有几个属性
        // 0 <= mark <= pos <= limit <= capacity
        // 容量
        System.out.println("capacity: " + buffer.capacity());
        // 读写位置
        System.out.println("position: " + buffer.position());
        // 移动指针 如果 pos < mark 抛弃 mark
        buffer.position(5);
        // 界限 超过它读写没有意义
        System.out.println("limit: " + buffer.limit());
        // 设置标记 用于重复动作
        buffer.mark();
        // 将当前位置设置到标记
        buffer.reset();
        // capacity - position = remaining
        System.out.println("remaining: " + buffer.remaining());
        // 重新设置界限到此位置 并复位到 0
        buffer.flip();
        System.out.println("after flip: ");
        System.out.println("cur pos: " + buffer.position());
        System.out.println("cur limit: " + buffer.limit());
        // 清除此缓冲区 将位置设置为零 将界限设置为容量 丢弃标记
        buffer.clear();
        System.out.println("after clear: ");
        System.out.println("cur pos: " + buffer.position());
        System.out.println("cur limit: " + buffer.limit());
        // 复位到 0 界限不变
        buffer.rewind();
        System.out.println("after rewind: ");
        System.out.println("cur pos: " + buffer.position());
        System.out.println("cur limit: " + buffer.limit());
    }
}